const Joi = require('joi');

// 用户验证规则
const userValidation = {
  // 注册验证
  register: Joi.object({
    username: Joi.string().alphanum().min(3).max(30).required().messages({
      'string.base': '用户名必须是字符串',
      'string.empty': '用户名不能为空',
      'string.min': '用户名最少3个字符',
      'string.max': '用户名最多30个字符',
      'string.alphanum': '用户名只能包含字母和数字',
      'any.required': '用户名是必填项'
    }),
    password: Joi.string().min(6).required().messages({
      'string.base': '密码必须是字符串',
      'string.empty': '密码不能为空',
      'string.min': '密码最少6个字符',
      'any.required': '密码是必填项'
    }),
    confirmPassword: Joi.string().valid(Joi.ref('password')).required().messages({
      'any.only': '两次输入的密码不一致',
      'any.required': '确认密码是必填项'
    }),
    name: Joi.string().required().messages({
      'string.base': '姓名必须是字符串',
      'string.empty': '姓名不能为空',
      'any.required': '姓名是必填项'
    }),
    email: Joi.string().email().required().messages({
      'string.base': '邮箱必须是字符串',
      'string.empty': '邮箱不能为空',
      'string.email': '邮箱格式无效',
      'any.required': '邮箱是必填项'
    }),
    role: Joi.string().valid('admin', 'manager', 'user').messages({
      'any.only': '角色必须是admin, manager或user'
    })
  }),

  // 登录验证
  login: Joi.object({
    username: Joi.string().required().messages({
      'string.base': '用户名必须是字符串',
      'string.empty': '用户名不能为空',
      'any.required': '用户名是必填项'
    }),
    password: Joi.string().required().messages({
      'string.base': '密码必须是字符串',
      'string.empty': '密码不能为空',
      'any.required': '密码是必填项'
    }),
    captcha: Joi.string().messages({
      'string.base': '验证码必须是字符串',
      'string.empty': '验证码不能为空'
    })
  }),

  // 更新用户信息验证
  update: Joi.object({
    name: Joi.string().messages({
      'string.base': '姓名必须是字符串',
      'string.empty': '姓名不能为空'
    }),
    email: Joi.string().email().messages({
      'string.base': '邮箱必须是字符串',
      'string.empty': '邮箱不能为空',
      'string.email': '邮箱格式无效'
    }),
    avatar: Joi.string().messages({
      'string.base': '头像地址必须是字符串'
    }),
    role: Joi.string().valid('admin', 'manager', 'user').messages({
      'any.only': '角色必须是admin, manager或user'
    }),
    status: Joi.string().valid('active', 'inactive').messages({
      'any.only': '状态必须是active或inactive'
    })
  }),

  // 修改密码验证
  changePassword: Joi.object({
    currentPassword: Joi.string().required().messages({
      'string.base': '当前密码必须是字符串',
      'string.empty': '当前密码不能为空',
      'any.required': '当前密码是必填项'
    }),
    newPassword: Joi.string().min(6).required().messages({
      'string.base': '新密码必须是字符串',
      'string.empty': '新密码不能为空',
      'string.min': '新密码最少6个字符',
      'any.required': '新密码是必填项'
    }),
    confirmPassword: Joi.string().valid(Joi.ref('newPassword')).required().messages({
      'any.only': '两次输入的新密码不一致',
      'any.required': '确认新密码是必填项'
    })
  })
};

// 产品验证规则
const productValidation = {
  create: Joi.object({
    name: Joi.string().required().messages({
      'string.base': '产品名称必须是字符串',
      'string.empty': '产品名称不能为空',
      'any.required': '产品名称是必填项'
    }),
    description: Joi.string().messages({
      'string.base': '产品描述必须是字符串'
    }),
    price: Joi.number().min(0).required().messages({
      'number.base': '价格必须是数字',
      'number.min': '价格不能小于0',
      'any.required': '价格是必填项'
    }),
    category: Joi.string().required().messages({
      'string.base': '分类必须是字符串',
      'string.empty': '分类不能为空',
      'any.required': '分类是必填项'
    }),
    stock: Joi.number().min(0).messages({
      'number.base': '库存必须是数字',
      'number.min': '库存不能小于0'
    }),
    status: Joi.string().valid('active', 'inactive').messages({
      'any.only': '状态必须是active或inactive'
    })
  }),

  update: Joi.object({
    name: Joi.string().messages({
      'string.base': '产品名称必须是字符串',
      'string.empty': '产品名称不能为空'
    }),
    description: Joi.string().messages({
      'string.base': '产品描述必须是字符串'
    }),
    price: Joi.number().min(0).messages({
      'number.base': '价格必须是数字',
      'number.min': '价格不能小于0'
    }),
    category: Joi.string().messages({
      'string.base': '分类必须是字符串',
      'string.empty': '分类不能为空'
    }),
    stock: Joi.number().min(0).messages({
      'number.base': '库存必须是数字',
      'number.min': '库存不能小于0'
    }),
    status: Joi.string().valid('active', 'inactive').messages({
      'any.only': '状态必须是active或inactive'
    })
  })
};

// 团队验证规则
const teamValidation = {
  create: Joi.object({
    name: Joi.string().required().messages({
      'string.base': '团队名称必须是字符串',
      'string.empty': '团队名称不能为空',
      'any.required': '团队名称是必填项'
    }),
    description: Joi.string().messages({
      'string.base': '团队描述必须是字符串'
    }),
    leader: Joi.string().required().messages({
      'string.base': '团队负责人ID必须是字符串',
      'string.empty': '团队负责人ID不能为空',
      'any.required': '团队负责人ID是必填项'
    }),
    members: Joi.array().items(Joi.string()).messages({
      'array.base': '成员必须是数组'
    }),
    status: Joi.string().valid('active', 'inactive').messages({
      'any.only': '状态必须是active或inactive'
    })
  }),

  update: Joi.object({
    name: Joi.string().messages({
      'string.base': '团队名称必须是字符串',
      'string.empty': '团队名称不能为空'
    }),
    description: Joi.string().messages({
      'string.base': '团队描述必须是字符串'
    }),
    leader: Joi.string().messages({
      'string.base': '团队负责人ID必须是字符串',
      'string.empty': '团队负责人ID不能为空'
    }),
    status: Joi.string().valid('active', 'inactive').messages({
      'any.only': '状态必须是active或inactive'
    })
  }),

  addMember: Joi.object({
    userId: Joi.string().required().messages({
      'string.base': '用户ID必须是字符串',
      'string.empty': '用户ID不能为空',
      'any.required': '用户ID是必填项'
    })
  })
};

// 设置验证规则
const settingValidation = {
  update: Joi.object({
    value: Joi.required().messages({
      'any.required': '值是必填项'
    }),
    description: Joi.string().messages({
      'string.base': '描述必须是字符串'
    })
  })
};

// 验证函数
const validate = (schema) => (req, res, next) => {
  const { error } = schema.validate(req.body);
  if (error) {
    return res.status(400).json({ 
      success: false,
      message: error.details[0].message 
    });
  }
  next();
};

module.exports = {
  validate,
  userValidation,
  productValidation,
  teamValidation,
  settingValidation
}; 